package com.xbongbong.saas.service;

import com.alibaba.fastjson.JSONObject;
import com.xbongbong.paas.domain.entity.PaasFormExplainEntity;
import com.xbongbong.paas.field.FieldAttrEntity;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.BaseDTO;
import com.xbongbong.pro.fundset.pojo.FundSetHandleExplainPojo;
import com.xbongbong.pro.fundset.pojo.FundSetTransitionPojo;
import com.xbongbong.pro.fundset.pojo.PeriodFilterPojo;
import com.xbongbong.paas.field.ReceivablePeriodPojo;
import com.xbongbong.pro.fundset.pojo.dto.FundSetConditionAttrDTO;
import com.xbongbong.pro.fundset.pojo.dto.FundSetDTO;
import com.xbongbong.pro.fundset.pojo.dto.FundSetListDTO;
import com.xbongbong.pro.fundset.pojo.dto.FundSetPayDTO;
import com.xbongbong.pro.fundset.pojo.dto.FundSetPaySaveDTO;
import com.xbongbong.pro.fundset.pojo.dto.FundSetPaymentSaveDTO;
import com.xbongbong.pro.fundset.pojo.vo.FundSetConditionAttrVO;
import com.xbongbong.pro.fundset.pojo.vo.FundSetListVO;
import com.xbongbong.pro.fundset.pojo.vo.FundSetPayListVO;
import com.xbongbong.pro.fundset.pojo.vo.FundSetPayVO;
import com.xbongbong.pro.fundset.pojo.vo.FundSetPaymentItemVO;
import com.xbongbong.pro.fundset.pojo.vo.FundSetPaymentSaveVO;
import com.xbongbong.pro.fundset.pojo.vo.FundSetVO;
import com.xbongbong.saas.enums.XbbRefTypeEnum;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author zcp
 * @version v1.0
 * @since v1.0
 */
public interface FundSetService {
    /**
     * 获取资金设置菜单list
     * @param fundSetListDTO
     * @return com.xbongbong.pro.fundset.pojo.vo.FundSetListVO
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    FundSetListVO getMenuList(FundSetListDTO fundSetListDTO) throws XbbException;

    /**
     * 应收规则详情、编辑获取
     * @param baseDTO
     * @return com.xbongbong.pro.fundset.pojo.vo.FundSetPaymentItemVO
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    FundSetPaymentItemVO paymentItem(BaseDTO baseDTO) throws XbbException;

    /**
     * 设置账期条件字段，只获取【下拉类型，单选类型】两种类型字段
     * @param fundSetConditionAttrDTO
     * @return com.xbongbong.pro.fundset.pojo.vo.FundSetConditionAttrVO
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    FundSetConditionAttrVO conditionAttr(FundSetConditionAttrDTO fundSetConditionAttrDTO) throws XbbException;

    /**
     * 应收规则保存
     * @param fundSetPaymentSaveDTO
     * @return com.xbongbong.pro.fundset.pojo.vo.FundSetPaymentSaveVO
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    @Transactional(rollbackFor = Exception.class)
    FundSetPaymentSaveVO paymentSave(FundSetPaymentSaveDTO fundSetPaymentSaveDTO) throws XbbException;

    /**
     * 获取当前启用的模式
     * @param corpid 公司id
     * @param xbbRefTypeEnum 业务类型，目前只有crm部分，传XbbRefTypeEnum.CRM，或XbbRefTypeEnum.JXC
     * @return java.lang.Integer @see com.xbongbong.pro.enums.fund.enums.ModelTypeEnum
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    Long getModelType(String corpid, XbbRefTypeEnum xbbRefTypeEnum);

    /**
     * 获取当前模式的管理方式
     * @param corpid 公司id
     * @param xbbRefTypeEnum 业务类型，目前只有crm部分
     * @return java.lang.Integer @see com.xbongbong.pro.enums.fund.enums.ManageTypeEnum
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    Integer getManageType(String corpid, XbbRefTypeEnum xbbRefTypeEnum);

    /**
     * 计算应收款的预计回款日期，及获取相应账期
     * @param corpid 公司id
     * @param time 回款计划的预计回款日期、发票的开票日期、出库的出库日期
     * @param linkCustomerId 应收款关联的客户id
     * @param linkContractId 应收款关联的合同id
     * @param generationDate 应收生成日期
     * @return com.xbongbong.pro.fundset.pojo.PeriodFilterPojo
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    PeriodFilterPojo getPeriodFilter4Payment(String corpid, Long time, Long linkCustomerId, Long linkContractId, Long generationDate) throws XbbException;

    /**
     * 新建客户、合同时，把当前模板的账期配置返回
     * @param corpid 公司id
     * @param businessType 业务类型，客户、合同
     * @param formId 表单id
     * @param explainList 客户/合同的解释list
     * @return com.xbongbong.pro.fundset.pojo.PeriodFilterPojo
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    List<FieldAttrEntity> formatPeriod(String corpid, Integer businessType, Long formId, List<FieldAttrEntity> explainList) throws XbbException;

    /**
     * 为经销商端的订货单塞入应收账期值（当应收规则为按照合同管理账期时，经销商端由于无下单类型字段供用户输入/选择，即无法自动生成默认账期，只能后端塞入）
     * @param corpid
     * @param paasFormExplainEntity 合同模板解释
     * @return com.xbongbong.paas.field.ReceivablePeriodPojo
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    ReceivablePeriodPojo formatPeriod4DistributorOrder(String corpid, PaasFormExplainEntity paasFormExplainEntity) throws XbbException;

    /**
     * 获取导入excel的默认账期值，根据设置的值去判断
     *
     * @param corpid 公司id
     * @param formId 表单id
     * @param jsonObject 导入的具体数据
     * @return
     * @throws XbbException
     */
    String getImportDefaultPeriod(String corpid, Long formId, JSONObject jsonObject) throws XbbException;

    /**
     * 特殊处理表单解释，资金三期存在切换模式的时候，表单解释停留在编辑表单解释界面，保存之后覆盖了资金设置里面的设置。所以更新之前都要读取资金设置里面的设置
     * 涉及到的表单模板：客户、合同、应收款、销项发票、回款单
     * @param corpid
     * @param explainEntity
     * @return com.xbongbong.paas.domain.entity.PaasFormExplainEntity
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    PaasFormExplainEntity handleSpecialExplain(String corpid, PaasFormExplainEntity explainEntity);

    /**
     * 初始化或新建表单时格式化表单模板解释时，根据corpid获取资金设置(corpid为0则返回“手动创建应收”模式，无账期)，并得到业务要处理的解释pojo
     * @param fundSetTransitionPojo
     * @param xbbRefTypeEnum XbbRefTypeEnum 枚举内的alias，根据alias判断是否需要根据资金设置的应收账期处理字段解释
     * @return com.xbongbong.pro.fundset.pojo.FundSetHandleExplainPojo
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    FundSetHandleExplainPojo getFundSetHandleExplainPojo4Init(FundSetTransitionPojo fundSetTransitionPojo, XbbRefTypeEnum xbbRefTypeEnum);

    /**
     * 初始化表单解释时，特殊处理表单解释，确保字段解释与资金设置应收规则匹配
     * 涉及到的表单模板：客户、合同、应收款、销项发票、回款单
     * @param fundSetHandleExplainPojo
     * @param fieldAttrEntity
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    void handleFieldEntity4Init(XbbRefTypeEnum xbbRefTypeEnum, FundSetHandleExplainPojo fundSetHandleExplainPojo, FieldAttrEntity fieldAttrEntity);

    /**
     * 信用额度设置-展示
     * @param baseDTO
     * @return
     * @throws XbbException
     */
    FundSetVO creditItem(BaseDTO baseDTO) throws XbbException;

    /**
     * 信用额度设置-开启、关闭
     * @param fundSetDTO
     * @return
     */
    FundSetVO creditSave(FundSetDTO fundSetDTO) throws XbbException;

    /**
     * 对账设置-展示
     * @param baseDTO
     * @return
     * @throws XbbException
     */
    FundSetPaymentItemVO statementItem(BaseDTO baseDTO) throws XbbException;

    /**
     * 对账设置-保存
     * @param fundSetPaymentSaveDTO
     * @return
     * @throws XbbException
     */
    FundSetVO statementSave(FundSetPaymentSaveDTO fundSetPaymentSaveDTO) throws XbbException;

    /**
     * 核销设置-展示
     * @param baseDTO
     * @return
     * @throws XbbException
     */
    FundSetVO writeOffItem(BaseDTO baseDTO) throws XbbException;

    /**
     * 核销设置-保存
     * @param fundSetDTO
     * @return
     * @throws XbbException
     */
    FundSetVO writeOffSave(FundSetDTO fundSetDTO) throws XbbException;

    /**
     * 支付设置列表-展示
     * @param baseDTO
     * @return
     */
    FundSetPayListVO payList(BaseDTO baseDTO) throws XbbException;

    /**
     * 支付设置展示
     * @param fundSetPayDTO
     * @return
     * @throws XbbException
     */
    FundSetPayVO payItem(FundSetPayDTO fundSetPayDTO) throws XbbException;

    /**
     * 支付设置-保存
     * @param fundSetPaySaveDTO
     * @return
     * @throws XbbException
     */
    FundSetVO paySave(FundSetPaySaveDTO fundSetPaySaveDTO) throws XbbException;

    /**
     * 支付设置-开启，关闭
     * @param fundSetDTO
     * @return
     * @throws XbbException
     */
    FundSetVO payEnable(FundSetDTO fundSetDTO) throws XbbException;


}
